package 异常的处理.异常的处理流程;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-21
 * Time: 20:08
 */
/*
如果向上一直传递都没有合适的方法处理异常, 最终就会交给 JVM 处理, 程序就会异常终止(和我们最开始未使用 try catch 时是一样的).
 */
public class Test1 {
    public static void func() {
        int[] array = {1, 2, 3, 4, 5};
        System.out.println(array[10]);
    }

    public static void main(String[] args) {
        func();
        System.out.println("after try catch");
    }
}

/*
执行结果：
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
	at 异常的处理.异常的处理流程.Test1.func(Test1.java:16)
	at 异常的处理.异常的处理流程.Test1.main(Test1.java:20)
 */

/*
解释执行结果：
括号里的内容提供了关于异常发生的详细上下文信息。这些信息对于调试和定位问题非常有用。以下是对括号内内容的解释：

1. **`Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10`**
   - `Exception in thread "main"`: 这表明异常发生在主线程（main thread）中。
   - `java.lang.ArrayIndexOutOfBoundsException: 10`: 这是异常的类型和详细信息。`ArrayIndexOutOfBoundsException` 是一个运行时异常，表示尝试访问数组的非法索引。在这个例子中，程序试图访问数组的第11个元素（因为数组索引从0开始，所以索引10实际上是第11个位置），但这个索引超出了数组的实际大小。

2. **`at 异常的处理.异常的处理流程.Test1.func(Test1.java:16)`**
   - 这行提供了异常发生位置的详细堆栈跟踪信息。
   - `异常的处理.异常的处理流程.Test1.func`: 这表明异常发生在名为 `Test1` 的类的 `func` 方法中。`异常的处理` 和 `异常的处理流程` 很可能是包含 `Test1` 类的包名（package name），其中 `异常的处理` 是一级包名，`异常的处理流程` 是二级包名。
   - `(Test1.java:16)`: 这表明异常发生在 `Test1.java` 文件的第16行。

3. **`at 异常的处理.异常的处理流程.Test1.main(Test1.java:20)`**
   - 这行提供了调用导致异常的方法的堆栈跟踪信息。
   - `异常的处理.异常的处理流程.Test1.main`: 这表明 `main` 方法在 `Test1` 类中被调用，而这个 `main` 方法很可能是程序的入口点。
   - `(Test1.java:20)`: 这表明 `main` 方法中调用导致异常的代码行在 `Test1.java` 文件的第20行。

综上所述，这个异常信息告诉我们，在 `Test1` 类的 `func` 方法中（具体在 `Test1.java` 文件的第16行），程序试图访问一个数组的非法索引（索引10），而这个调用是在 `main` 方法中（`Test1.java` 文件的第20行）发起的。这些信息对于快速定位和修复代码中的问题至关重要。
 */

/*
可以看到，程序已经异常停止了，没有执行System.out.println("after try catch");这一行

【异常处理流程总结】
- 程序先执行 try 中的代码
- 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
- 如果找到匹配的异常类型, 就会执行 catch 中的代码
- 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
- 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
- 如果上层调用者也没有处理的了异常, 就继续向上传递.
- 一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止.
 */